// 路由中间件函数抽离为controller
// 统一导入之后解构出User
const { User } = require('../model')
// 导入jwt用于生成验证token
const jwt = require('../util/jwt')
// 导入secret
const { jwtSecret } = require('../config/config.default')

// 用户登录
exports.login = async (req,res, next) => {
    try {
        // 1. 数据验证
        // 2. 生成token，其中的user是在validator login中共用的那个user，此时它还是个mongoose对象，为了使用它，我们用json将其转换
        const user = req.user.toJSON()
        // 一般不把全部的信息给它，给个id就成了
        // 签发令牌时，给个过期时间(单位：秒)
        const token = await jwt.sign({
            userId: user._id
        }, jwtSecret, {
            expiresIn: 60 * 60 *24
        })
        // 3. 发送成功响应（包含token的用户信息）
        delete user.password
        res.status(200).json({
            ...user,
            token
        })
    } catch (err) {
        next(err)
    }
}

// 用户注册
exports.register = async (req,res,next) => {
    try {
        // 1. 获取请求体数据
        console.log(req.body);
        // 2. 数据验证
        // 2.1 基本数据验证
        // 2.2 业务数据验证

        // 3. 验证通过，将数据保存到数据库
        let user = new User(req.body.user)
        // 3.1 调用save方法，保存到数据库
        await user.save()
        // 3.3 返回之前，为了将创建的密码信息隐藏不做返回，将其删除
        // 但是user是创建的一个使用mongoose封装的对象，不能直接删除，需要先将其转换
        user = user.toJSON()
        delete user.password
        // 4. 发送成功响应，把注册成功了的信息返回给客户端
        res.status(201).json({
            user
        })
    } catch (err) {
        next(err)
    }
}

// 获取当前登录用户
exports.getCurrentUser = async (req,res, next) => {
    try {
        res.status(200).json({
            user: req.user
        })
    } catch (err) {
        next(err)
    }
}

// 更新当前登录用户
exports.updateCurrentUser = async (req,res, next) => {
    try {
        // 处理请求
        res.send('/user')
    } catch (err) {
        next(err)
    }
}